#include "led_error.h"
#ifndef ledERROR_DIR
#include "_config_cpu_device.h"
#endif

static void led_SetupPorts(void);
static void led_State(int st);

#if defined(CPU_ARM_LPC)
static void led_SetupPorts(void) {
	ledERROR_DIR |= ledERROR;
	ledERROR_OFF |= ledERROR;
}

static void led_State(int st) {
	if (st == pdON) ledERROR_ON |= ledERROR; else ledERROR_OFF |= ledERROR;
}
#endif

void ledError_Init(void) {
	led_SetupPorts();
}

static volatile uint error = 0;
static uint ledBlink = pdFALSE;

// função que determina a quantidade de piscadas do erro, sinalizando o tipo do erro
void ledError_Blink(uint n_blink, uint st) {
	error = n_blink;
	ledBlink = st;
}


// função de sistema para ser chamado a cada 1ms
// o numero do erro representa a quantidade de vezes que led vai piscar. Se for valor 0 deixa o led apagado
void ledError_Tick(void) {
	if (!ledBlink) return;

	static int count1 = 0;
	static int count2 = 0;
	static int ff = 0;
	static int nTimes = 0;

	if (count1==0) {
		if (count2==0) { // Prepara o intervalo entre as piscadas do led
			count2 = 1000;
			nTimes = 2*(error);
		}

		if (nTimes>0) { // Pisca o led por 250 ms vezes nTimes
			if (ff)	led_State(pdOFF); else led_State(pdON);
			count1 = 250;
			ff ^= 1;
			nTimes--;
		} else { // Mantém o led apagado por 1 segundo
			led_State(pdOFF);
			if (count2) count2--;
		}
	}

	if (count1) count1--;
}

